﻿using Baidu.Push.Api.Response;
using Baidu.Push.Api.Util;
using System;
using System.Collections.Generic;
using System.Text;

namespace Baidu.Push.Api.Request
{
    /// <summary>
    /// 推送消息，该接口可用于推送单个人、一群人、所有人以及固定设备的使用场景。
    /// </summary>
    public class PushMsgRequest : IPushRequest<PushMsgResponse>
    {
        /// <summary>
        /// 用户标识，在Android里，channel_id + userid指定某一个特定client。不超过256字节，如果存在此字段，则只推送给此用户。
        /// </summary>
        public string UserId { get; set; }

        /// <summary>
        /// 1：单个人，必须指定user_id 和 channel_id （指定用户的指定设备）或者user_id（指定用户的所有设备）
        /// 2：一群人，必须指定tag
        /// 3：所有人，无需指定tag、user_id、channel_id
        /// </summary>
        public uint PushType { get; set; }

        /// <summary>
        /// 通道标识
        /// </summary>
        public ulong? ChannelId { get; set; }

        /// <summary>
        /// 标签名称，不超过128字节
        /// </summary>
        public string Tag { get; set; }

        /// <summary>
        /// 设备类型，取值范围为：1～5
        /// 云推送支持多种设备，各种设备的类型编号如下：
        /// 1：浏览器设备；
        /// 2：PC设备；
        /// 3：Andriod设备；
        /// 4：iOS设备；
        /// 5：Windows Phone设备；
        /// 如果存在此字段，则向指定的设备类型推送消息。 默认为android设备类型。
        /// </summary>
        public uint? DeviceType { get; set; }

        /// <summary>
        /// 0：消息（透传给应用的消息体）
        /// 1：通知（对应设备上的消息通知）
        /// </summary>
        public uint? MessageType { get; set; }

        /// <summary>
        /// 指定消息内容，单个消息为单独字符串。如果有二进制的消息内容，请先做 BASE64 的编码。
        /// </summary>
        public string Messages { get; set; }

        /// <summary>
        /// 消息标识。
        /// 指定消息标识，必须和messages一一对应。相同消息标识的消息会自动覆盖。特别提醒：该功能只支持android、browser、pc三种设备类型。
        /// </summary>
        public string MsgKeys { get; set; }

        /// <summary>
        /// 指定消息的过期时间，默认为86400秒。必须和messages一一对应。
        /// </summary>
        public uint? MessageExpires { get; set; }

        /// <summary>
        /// 部署状态。指定应用当前的部署状态，可取值：
        /// 1：开发状态
        /// 2：生产状态
        /// 若不指定，则默认设置为生产状态。特别提醒：该功能只支持ios设备类型。
        /// </summary>
        public uint? DeployStatus { get; set; }

        #region IPushRequest

        public string GetApiName()
        {
            return "push_msg";
        }

        public IDictionary<string, string> GetParameters()
        {
            PushDictionary parameters = new PushDictionary();
            parameters.Add("user_id", this.UserId);
            parameters.Add("push_type", this.PushType);
            parameters.Add("channel_id", this.ChannelId);
            parameters.Add("tag", this.Tag);
            parameters.Add("device_type", this.DeviceType);
            parameters.Add("message_type", this.MessageType);
            parameters.Add("messages", this.Messages);
            parameters.Add("msg_keys", this.MsgKeys);
            parameters.Add("message_expires", this.MessageExpires);
            parameters.Add("deploy_status", this.DeployStatus);
            return parameters;
        }

        public void Validate()
        {
            RequestValidator.ValidateRequired("push_type", this.PushType);
            RequestValidator.ValidateRequired("messages", this.Messages);
            RequestValidator.ValidateRequired("msg_keys", this.MsgKeys);
        }

        #endregion
    }
}
